package ch.mailbox;

import ch.exception.MessageNotFoundException;
import ch.exception.ObjectNotFoundException;


/** Classe per la gestione dei messaggi, derivata da <b>PersistentObject</b>.
*
* @author Neil Otupacca - May 21 2011
*
*/
public class Message extends PersistentObject {

	private User user;
	@Persistent
	@AutoDefaultReadOnly
	private String msgTime;
	@Persistent(name="msg")
	private String message;
	@Persistent
	private boolean unreadStatus;

	/** Istanzia un oggetto Message inizializzato con utente proprietario,
	 * e stringa di messaggio.
	 *
	 * @param emailAddr - indirizzo email.
	 * @param firstName - nome.
	 * @param lastName - cognome.
	 * @param password - password di accesso.
	 */
	Message(User user, String message, int id, boolean unreadStatus) {  // Accesso package (non pubblico)
		//this(user, message, "", 0, unreadStatus);
		super("messages");
		this.user = user;
		this.emailAddr = user.getEmailAddress();
		this.message = message;
		this.msgTime = "";
		this.id = id;
		this.unreadStatus = unreadStatus;
	}

	/** Constructor protetto utilizzato internamente da <b>newInstance()</b>
	 * nel meethod <b>getPersistentObjectList()</b>.
	 */
	protected Message() {
		this(new User(), "", 0, true);
	}

	/** Crea un oggetto Message caricandolo dal database.
	 *
	 * @param user - oggetto <b>User</b> proprietario del messaggio.
	 * @param id - identificatore univoco del messaggio.
	 * @return messaggio.
	 */
	static Message getMessage(User user, int id) {  // Accesso package (non pubblico)
		Message msg = new Message(user, "", id, true);

		try {
			msg.getPersistentObject(true);  // Carica il messaggio dal database
		} catch (ObjectNotFoundException e) {
			throw new MessageNotFoundException();
		}

		return(msg);
	}

	/** Elimina il messaggio dal database.
	 *
	 * @return numero di messaggi cancellati (0 - 1).
	 */
	@Override
	public int delete() {
		return(super.delete());
	}

	/** Ritorna l'utente a cui appartiene il messaggio.
	 *
	 * @return utente.
	 */
	public User getMessageUser() {
		return(user);
	}

	/** Ritorna la stringa della data e ora del messaggio,
	 * formato stringa MySQL (<i>YYYY-MM-DD hh:mm:ss</i>).
	 *
	 * @return data e ora del messaggio.
	 */
	public String getMessageTime() {
		return(msgTime);
	}

	/** Ritorna la stringa con l'intero messaggio.
	 *
	 * @return messaggio.
	 */
	public String getMessageContent() {
		return(message);
	}

	/** Ritorna lo stato di lettura del messaggio.
	 *
	 * @return <b>true</b> se il messaggio non è ancora stato letto.
	 */
	public boolean getUnreadStatus() {
		return(unreadStatus);
	}

	/** Imposta lo stato di lettura del messaggio, <b>true</b> per
	 * lo stato di messaggio non letto.
	 *
	 * @param unreadStatus - stato di lettura del messaggio.
	 */
	public void setUnreadStatus(boolean unreadStatus) {
		this.unreadStatus = unreadStatus;
		update();
	}
}
